package packageClient;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.util.ArrayList;
import java.util.Timer;

import javax.swing.ButtonGroup;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JRadioButton;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.border.LineBorder;

import packageComune.InterfacciaServer;
import packageComune.ServerProxy;
import packageServer.Server;

public class GUI extends JFrame {

	private static final long serialVersionUID = 1L;

	private Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); // serve per accentrare le finestre
	private ArrayList<String> lista = new ArrayList<String>(); // Array di appoggio per ricevere liste di giocatori o punteggi
	private ArrayList<Integer> virgole = new ArrayList<Integer>();
	private JTextField tf1; // un campo di scrittura
	private JTextField tf2; // secondo campo di scrittura
	private JTextField tf3;
	private JPasswordField pf1; // campo per password
	private String tipo=""; // tipo dinosauro
	private JFrame window;
	private JFrame sessioneDiGioco;
	private String esito;
	private JPanel grigliamappa = new JPanel(new GridLayout(40, 40));
	private JScrollPane scroll = new JScrollPane(grigliamappa);
	private ImageIcon terra, vege, acqua, carogna, buio, dinoMio,dinoEnemy,FnF,terra_fog,vege_fog,acqua_fog,carogna_fog,dino_fog;
	private Client client;
	private String username;
	private GiaMosso giamosso;
	private JLabel turno;
	private Timer t2;
	private JButton[] caselle = new JButton[40 * 40];
	private int grigliaHeight=0,grigliaWidth=0;
	

	public GUI() {
		// Questo e il primo frame generato
		nuovoForm("Scelta connessione", null); // chiama il metodo che genera il
												// frame basandosi sulla stringa
												// ricevuta	
		giamosso=new GiaMosso();
	}
	
	
	/**
	 * Crea un nuovo Frame che contiene la sessione di gioco, intesa come la schermata coi comandi in game e la mappa.
	 * Il metodo viene invocato al primo accesso e assenga alle variabili ImageIcon le relative icone, crea il layout di gioco
	 * e assegna ai JButton i relativi Listener.
	 */
	private void nuovaSessione() {
		sessioneDiGioco = new JFrame(tipo);
		sessioneDiGioco.setTitle("ISOLA DEI DINOSAURI");
		sessioneDiGioco.setExtendedState(MAXIMIZED_BOTH);
		sessioneDiGioco.setLayout(new BorderLayout());
		

		ImageIcon logo;

		logo = new ImageIcon((getClass().getResource("/pictures/sfondo1.png")));
		terra = new ImageIcon((getClass().getResource("/pictures/terra.jpg")));
		vege = new ImageIcon((getClass().getResource("/pictures/vegetazione.jpg")));
		acqua = new ImageIcon((getClass().getResource("/pictures/waterIcon.jpg")));
		carogna = new ImageIcon((getClass().getResource("/pictures/ham1.jpg")));
		buio = new ImageIcon((getClass().getResource("/pictures/buio.png")));
		dinoMio = new ImageIcon((getClass().getResource("/pictures/dinoMio.jpg")));
		dinoEnemy = new ImageIcon(getClass().getResource("/pictures/dinoEnemy.jpg"));
		terra_fog = new ImageIcon((getClass().getResource("/pictures/terra_fog.jpg")));
		vege_fog = new ImageIcon((getClass().getResource("/pictures/vegetazione_fog.jpg")));
		acqua_fog = new ImageIcon((getClass().getResource("/pictures/waterIcon_fog.jpg")));
		carogna_fog = new ImageIcon((getClass().getResource("/pictures/ham1_fog.jpg")));
		dino_fog= new ImageIcon((getClass().getResource("/pictures/dino_fog.jpg")));
		FnF=new ImageIcon(getClass().getResource("/pictures/FnF.jpg"));

		JPanel nord = new JPanel(new GridLayout(1, 5));
		JButton classifica = new JButton("Classifica");	
		JButton giocatori = new JButton("Giocatori");	
		JLabel user = new JLabel("         UTENTE:          "+username.toUpperCase());
		user.setBorder(new LineBorder(Color.BLACK, 1, true));
		user.setBackground(Color.yellow);
		user.setForeground(Color.BLUE);
		turno = new JLabel("");
		
		Timer t1= new Timer();
		t2=new Timer();
		t1.scheduleAtFixedRate(new ActionTimer(client,turno,sessioneDiGioco,username,t2,giamosso),1000, 1000);
		
		turno.setBorder(new LineBorder(Color.BLACK, 1, true));
		turno.setBackground(Color.yellow);
		turno.setForeground(Color.BLUE);
		
		JButton sfondo = new JButton();	
		sfondo.setBackground(Color.yellow);
		sfondo.setIcon(logo);

		classifica.addActionListener(new visualizzaClass());
		nord.add(classifica);
		giocatori.addActionListener(new listaGioc());
		nord.add(giocatori);
		nord.add(user);
		nord.add(turno);
		nord.add(sfondo);

		JPanel est = new JPanel(new GridLayout(9, 1));
		JButton aggiorna = new JButton("Aggiorna Mappa");
		
		JButton stato = new JButton("Stato");
		JButton vista = new JButton("Vista Locale");
		JButton muovi = new JButton("Muovi");
		JButton cresci = new JButton("Cresci");
		JButton deponi = new JButton("Deponi");
		JButton lista = new JButton("Lista Dinosauri");
		JButton passaTurno = new JButton("Passa Turno");
		JButton esci = new JButton("Uscita Partita");

		
		aggiorna.addActionListener(new refreshMap());
		est.add(aggiorna);
		stato.addActionListener(new statoDino());
		est.add(stato);
		vista.addActionListener(new vistaDino());
		est.add(vista);
		muovi.addActionListener(new muovi());	
		est.add(muovi);
		cresci.addActionListener(new cresci());	
		est.add(cresci);
		deponi.addActionListener(new deponi());	
		est.add(deponi);
		lista.addActionListener(new lista());
		est.add(lista);
		passaTurno.addActionListener(new passaTurno());
		est.add(passaTurno);		
		esci.addActionListener(new esci());	
		est.add(esci);

		aggiornaMappa(client.mappaGenerale());

		sessioneDiGioco.add(nord, BorderLayout.NORTH);
		sessioneDiGioco.add(est, BorderLayout.EAST);
		sessioneDiGioco.setDefaultCloseOperation(EXIT_ON_CLOSE);
		sessioneDiGioco.add(scroll, BorderLayout.CENTER);
		sessioneDiGioco.setVisible(true);
	}

	
	/**
	 * Crea un nuovo Frame generale, una finestra-contenitore del Frame specifico che viene richiesto.
	 * La selezione viene effettuata mediante una sequenza di if che, a seconda del comando passato con "tipo",
	 * invoca un metodo diverso per gestire il Frame appena creato
	 * 
	 * @param tipo Viene passato il nome del nuovo frame da creare e, mediante degli if, si invocera' il metodo opportuno
	 * per la sua inizializzazione.
	 * @param esito Serve a passare ulteriori parametri di appoggio, come la mappa, se necessario. Null se non serve.
	 */
	//@requires tipo!=null;
	private void nuovoForm(String tipo, String esito) { // generatore di
														// frame=form
		window = new JFrame(tipo); // genera ogni volta un frame nuovo
									// i bottoni e gli altri componenti verranno
									// aggiunti dai metodi
		if (tipo.equals("Scelta connessione")) // appositi
			this.connessione();

		if (tipo.equals("Identificazione"))
			this.menuUno(); // per es. questo contiene il codice per scrivere i
							// bottoni del menuUno

		if (tipo.equals("Menu Crea Giocatore"))
			this.creaGioc();

		if (tipo.equals("Login"))
			this.menuLogin();

		if (tipo.equals("Scelta Mappa"))
			this.sceltaMappa();

		if (tipo.equals("Menu Fuori Partita"))
			this.menuFuoriPartita();

		if (tipo.equals("Classifica Generale"))
			this.classifica();

		if (tipo.equals("Attualmente in Partita"))
			this.listaGioc();

		if (tipo.equals("Crea una nuova razza!!!"))
			this.creaRazza();

		if (tipo.equals("LogoutToId"))
			this.menuUno();

		if (tipo.equals("Lista dei Dinosauri"))
			this.listaDino();

		if (tipo.equals("Cresci Dinosauro"))
			this.cresciDinosauro();

		if (tipo.equals("Deponi Uovo"))
			this.deponiUovo();

		if (tipo.equals("Muovi Dinosauro"))
			this.muoviDino();

		if (tipo.equals("Vista Locale"))
			this.vistaLocale();

		if (tipo.equals("Stampa Vista Locale"))
			this.stampaVistaLocale();

		if (tipo.equals("Stato Dino"))
			this.statoDino();

		if (tipo.equals("Stampa Stato Dino"))
			this.stampaStatoDino();
		
		if (tipo.equals("Scelta Partita"))
			this.sceltaPartita();
		

		window.setLocation((screenSize.width / 2) - (window.getWidth() / 2),
				(screenSize.height / 2) - (window.getHeight() / 2));
		window.setVisible(true);
	}

	
	// adesso iniziano i metodi che riempiono il frame creato con i componenti
	// giusti
	
		
	/**
	 * Quando chiamato, aggiorna la mappa di gioco; l'utente, all'interno dell'area di visuale dei propri dinosauri,
	 * puo' cosi' vedere le modifiche che si sono verificate (ingresso di un dinosauro nemico, nuove carogne...).
	 * 
	 * @param mess Messaggio contenente la mappa che deve essere visualizzata all'utente.
	 */
	//@requires mess!=null;
	//@assert i>=0;
	//@assert j>=0;
	//@assert (x>=0)&&(x<40);
	//@assert (y>=0)&&(y<40);
	public void aggiornaMappa(String mess) {
		int i, j = 0, x = 0, y = 0;
		
		for (i = 0; i < 1600; i++)
			caselle[i] = null;
		String idDino;

		grigliamappa.removeAll();
		grigliamappa.setPreferredSize(new Dimension(3000, 3000));

		if (mess.substring(1, 3).equals("ma")) // la risposta positiva della
												// mappa non e' 'ok' ma
												// @mappaGenerale
		{
			for (i = 22; i < mess.length(); i++) // controllo su quale immagine
													// mettere a ogni bottone
			{
				
				if (mess.substring(i, i + 1).equals("w")) {
					caselle[j] = new JButton();
					caselle[j].setIcon(acqua_fog);
					grigliamappa.add(caselle[j]);
					caselle[j].setToolTipText("[" + x + "," + y + "]");
					j++;
					if (y == 39) {
						x++;
						y = 0;
					} else
						y++;
				}

				if (mess.substring(i, i + 1).equals("l")) {
					caselle[j] = new JButton();
					caselle[j].setIcon(terra_fog);
					grigliamappa.add(caselle[j]);
					caselle[j].setToolTipText("[" + x + "," + y + "]");
					j++;
					if (y == 39) {
						x++;
						y = 0;
					} else
						y++;
				}

				if (mess.substring(i, i + 1).equals("h")) {
					caselle[j] = new JButton();
					caselle[j].setIcon(carogna_fog);
					grigliamappa.add(caselle[j]);
					caselle[j].setToolTipText("[" + x + "," + y + "]");
					j++;
					if (y == 39) {
						x++;
						y = 0;
					} else
						y++;
				}

				if (mess.substring(i, i + 1).equals("e")) {
					caselle[j] = new JButton();
					caselle[j].setIcon(dino_fog);
					grigliamappa.add(caselle[j]);
					caselle[j].setToolTipText("[" + x + "," + y + "]");
					j++;
					if (y == 39) {
						x++;
						y = 0;
					} else
						y++;
				}

				if (mess.substring(i, i + 1).equals("p")) {
					caselle[j] = new JButton();
					caselle[j].setIcon(vege_fog);
					grigliamappa.add(caselle[j]);
					caselle[j].setToolTipText("[" + x + "," + y + "]");
					j++;
					if (y == 39) {
						x++;
						y = 0;
					} else
						y++;
				}
				
				if (mess.substring(i, i + 1).equals("t")) {
					caselle[j] = new JButton();
					caselle[j].setIcon(terra);
					grigliamappa.add(caselle[j]);
					caselle[j].setToolTipText("[" + x + "," + y + "]");
					j++;
					if (y == 39) {
						x++;
						y = 0;
					} else
						y++;
				}

				if (mess.substring(i, i + 1).equals("b")) {
					caselle[j] = new JButton();
					caselle[j].setIcon(buio);
					grigliamappa.add(caselle[j]);
					caselle[j].setToolTipText("[" + x + "," + y + "]");
					j++;
					if (y == 39) {
						x++;
						y = 0;
					} else
						y++;
				}

				if (mess.substring(i, i + 1).equals("c")) {
					caselle[j] = new JButton();
					caselle[j].setIcon(carogna);
					grigliamappa.add(caselle[j]);
					caselle[j].setToolTipText("[" + x + "," + y + "]");
					j++;
					if (y == 39) {
						x++;
						y = 0;
					} else
						y++;
				}

				if (mess.substring(i, i + 1).equals("v")) {
					caselle[j] = new JButton();
					caselle[j].setIcon(vege);
					grigliamappa.add(caselle[j]);
					caselle[j].setToolTipText("[" + x + "," + y + "]");
					j++;
					if (y == 39) {
						x++;
						y = 0;
					} else
						y++;
				}

				if (mess.substring(i, i + 1).equals("d")) {
					idDino = "";
					caselle[j] = new JButton();
					grigliamappa.add(caselle[j]);

					if (mess.substring(i + 1, i + 2).equals(",")) {
						int k = i + 2;
						do {
							idDino = idDino + mess.substring(k, k + 1);
							k++;
						} while (!mess.substring(k, k + 1).equals("]"));
						caselle[j].setToolTipText("[" + x + "," + y
								+ "];IdDino=" + idDino);

						caselle[j].setIcon(dinoMio);
					}
					else{
						caselle[j].setToolTipText("[" + x + "," + y + "]");
						caselle[j].setIcon(dinoEnemy);
					}
					j++;
					if (y == 39) {
						x++;
						y = 0;
					} else
						y++;
				}

				if (mess.substring(i, i + 1).equals("a")) {
					caselle[j] = new JButton();
					caselle[j].setIcon(acqua);					
					grigliamappa.add(caselle[j]);					
					caselle[j].setToolTipText("[" + x + "," + y + "]");
					j++;
					if (y == 39) {
						x++;
						y = 0;
					} else
						y++;
				}
				
				
			}
			scroll.setVisible(true);
		} else
			stampaMex("Non puoi giocare senza una specie non estinta!");	
	}	
	
	class ImagePanel extends JPanel {

		private static final long serialVersionUID = 1L;
		private Image img;

		  public ImagePanel(String img) {
		    this(new ImageIcon(img).getImage());
		  }

		  public ImagePanel(Image img) {
		    this.img = img;
		    Dimension size = new Dimension(grigliaWidth,grigliaHeight);
		    setPreferredSize(size);
		    setMinimumSize(size);
		    setMaximumSize(size);
		    setSize(size);
		    setLayout(getLayout());
		    setOpaque(false);
		    setVisible(true);
		  }

		  public void paintComponent(Graphics g) {
			  g.drawImage(img, 0, 0, null);
	            Dimension d = getSize();
	            g.drawImage(img, 0, 0, d.width, d.height, null);
	            super.paintComponent(g);
		  }
		}
		
	
	/**
	 * Metodo che implementa il Frame di base come "Menu di Accesso", permettendo di scegliere tra
	 * Crea Razza, Accesso alla Partita, Visualizza Classifica, Visualizza Lista GIocatori o Logout.
	 * Ogni comando attivera' il relativo Listener e creera' un nuovo Frame adeguato.
	 */
	private void menuFuoriPartita() {
		ImageIcon vuoto;
		vuoto = new ImageIcon(getClass().getResource("/pictures/vuoto.png"));
		window.setSize(screenSize.width / 3, screenSize.height - 50);
		window.setDefaultCloseOperation(EXIT_ON_CLOSE);
		window.setLayout(new BorderLayout());

		ImagePanel sfondoLogo = new ImagePanel(new ImageIcon(getClass().getResource("/pictures/sfondo.jpg")).getImage());
		
		JPanel grigliaEsterna = new JPanel(new GridLayout(2,1));
		grigliaEsterna.setOpaque(false);
		grigliaEsterna.setVisible(true);
		
		JPanel pannello = new JPanel(new GridLayout(2, 2));
		JPanel pannello1 = new JPanel();
		
		JButton b1 = new JButton("CREA RAZZA");
		JButton b2 = new JButton("ACCEDI ALLA PARTITA");
		JButton b3 = new JButton("CLASSIFICA");
		JButton b4 = new JButton("LISTA GIOCATORI");

		JButton b5 = new JButton("LOGOUT");
		JButton b6 = new JButton();
		b6.setIcon(vuoto);
		b6.setVisible(false);

		b1.addActionListener(new creaRazza());
		b2.addActionListener(new menuGioco());
		scroll.setVisible(true);
		b3.addActionListener(new visualizzaClass());
		b4.addActionListener(new listaGioc());
		b5.addActionListener(new logout());

		window.setTitle("MENU DI ACCESSO");
		grigliaEsterna.add(sfondoLogo);
		pannello.add(b1);
		pannello.add(b2);
		pannello.add(b3);
		pannello.add(b4);
		grigliaEsterna.add(pannello);
		pannello1.add(b5, BorderLayout.CENTER);
		pannello1.add(b6, BorderLayout.EAST);
		window.add(pannello1, BorderLayout.SOUTH);
		window.add(grigliaEsterna);
	}

	/**
	 * Metodo che implementa il Frame di base come "Crea nuovo Giocatore", permettendo di accedere al menu
	 * di creazione per inserire Username, Password, per poi confermare la registrazione o tornare indietro al menu
	 * precedente.
	 */
	private void creaGioc() {

		window.setSize(350, 250);

		window.setLayout(new BorderLayout());

		JLabel l1 = new JLabel("Username: ");
		JLabel l2 = new JLabel("Password: ");
		tf1 = new JTextField();
		pf1 = new JPasswordField();
		JButton b1 = new JButton("Conferma");
		JButton b2 = new JButton("Indietro");

		b1.addActionListener(new creaGiocatore());
		b2.addActionListener(new backToId());

		JPanel pannello = new JPanel();
		pannello.setLayout(new GridLayout(3, 2));

		pannello.add(l1);
		pannello.add(tf1);
		pannello.add(l2);
		pannello.add(pf1);
		pannello.add(b1);
		pannello.add(b2);

		window.setTitle("CREAZIONE NUOVO UTENTE");
		window.add(pannello, BorderLayout.CENTER);
	}

	/**
	 * Metodo che implementa il Frame di base come "Menu di Login", permettendo di usufruire del menu di
	 * accesso in cui inserire Username e Password di un utente esistente, confermando l'accesso o tornando indietro.
	 */
	private void menuLogin() {
		window.setSize(350, 250);
		window.setLayout(new BorderLayout());

		JLabel l1 = new JLabel("Username: ");
		JLabel l2 = new JLabel("Password: ");
		tf1 = new JTextField();
		pf1 = new JPasswordField();
		JButton b1 = new JButton("Conferma");
		JButton b2 = new JButton("Indietro");

		b1.addActionListener(new login());
		b2.addActionListener(new backToId());

		JPanel pannello = new JPanel();
		pannello.setLayout(new GridLayout(3, 2));

		pannello.add(l1);
		pannello.add(tf1);
		pannello.add(l2);
		pannello.add(pf1);
		pannello.add(b1);
		pannello.add(b2);

		window.setTitle("LOGIN");
		window.add(pannello, BorderLayout.CENTER);
	}

	/**
	 * Metodo che implementa il Frame di base come "Menu Fuori Partita", permettendo di scegliere tra
	 * Crea Giocatore, Login, Esci dal Gioco.
	 */
	private void menuUno() {
		window.setSize(300, 300);
		window.setDefaultCloseOperation(EXIT_ON_CLOSE);
		window.setLayout(new BorderLayout());

		JButton b1 = new JButton("Crea Giocatore");
		JButton b2 = new JButton("Login");
		JButton b3 = new JButton("Esci dal gioco");		
		b3.addActionListener(new chiudiTutto());

		b1.addActionListener(new menuCreaGioc());
		b2.addActionListener(new menuLogin());
		

		JPanel pannello = new JPanel();
		pannello.setLayout(new GridLayout(3, 1));

		pannello.add(b1);
		pannello.add(b2);
		pannello.add(b3);

		window.setTitle("MENU FUORI PARTITA");
		window.add(pannello, BorderLayout.CENTER);
	}

	/**
	 * Metodo che implementa il Frame di base come "Menu di Connessione", permettendo di scegliere il tipo di
	 * connessione che si intende utilizzare tra
	 * Locale, Socket o RMI.
	 */
	private void connessione() {
		window.setSize(450, 400);
		window.setDefaultCloseOperation(EXIT_ON_CLOSE);
		window.setLayout(new BorderLayout());

		JPanel pannello = new JPanel();
		pannello.setLayout(new GridLayout(3, 1));

		JButton b1 = new JButton("Locale");
		JButton b2 = new JButton("Socket");
		JButton b3 = new JButton("RMI");

		b1.addActionListener(new Locale());
		b2.addActionListener(new Sock());
		b3.addActionListener(new RMI());
		
		pannello.add(b1);
		pannello.add(b2);
		pannello.add(b3);

		window.setTitle("SCEGLI IL TIPO DI CONNESSIONE");
		window.add(pannello, BorderLayout.CENTER);
	}

	/**
	 * Metodo che implementa il Frame di base come "Menu di Scelta Mappa", permettendo di scegliere il tipo di
	 * mappa da utilizzare, tra
	 * Casuale o Caricata da File.
	 */
	private void sceltaMappa() {
		window.setSize(450, 300);

		window.setDefaultCloseOperation(EXIT_ON_CLOSE);
		window.setLayout(new BorderLayout());

		JPanel pannello = new JPanel();
		pannello.setLayout(new GridLayout(2, 1));

		JButton b1 = new JButton("Casuale");
		JButton b2 = new JButton("Caricata da File");

		b1.addActionListener(new MappaRandom());
		b2.addActionListener(new LoadMap());

		pannello.add(b1);
		pannello.add(b2);

		window.setTitle("SCEGLI IL TIPO DI MAPPA");
		window.add(pannello, BorderLayout.CENTER);
	}
	
	/**
	 * Metodo che implementa il Frame di base come "Scelta del tipo di Partita", permettendo di scegliere se continuare
	 * una partita esistente, mediante il Carica Gioco, o crearne una nuova, Nuovo Gioco.
	 */
	private void sceltaPartita(){
		window.setSize(450, 300);
		window.setDefaultCloseOperation(EXIT_ON_CLOSE);
		window.setLayout(new BorderLayout());
		
		JPanel pannello = new JPanel();
		pannello.setLayout(new GridLayout(2, 1));

		JButton b1 = new JButton("Nuovo Gioco");
		JButton b2 = new JButton("Carica Gioco");

		b1.addActionListener(new nextFrame());
		b2.addActionListener(new loadGame());

		pannello.add(b1);
		pannello.add(b2);
		
		window.setTitle("SCEGLI SE VUOI CARICARE LA PARTITA");
		window.add(pannello, BorderLayout.CENTER);
	}

	
	/**
	 * Metodo che implementa il Frame di base come "Crea nuova Razza", permettendo di accedere al menu
	 * di creazione per inserire Nome della Razza, Tipo della Razza e confermare la creazione o tornare indietro al menu
	 * precedente.
	 */
	private void creaRazza() {
		window.setSize(600, 200);
		window.setLayout(new BorderLayout());

		JLabel l1 = new JLabel("Nome Razza: ");
		JLabel l2 = new JLabel("Tipo Razza: ");
		l1.setBorder(new LineBorder(Color.BLACK, 1, false));
		l2.setBorder(new LineBorder(Color.BLACK, 1, true));

		tf1 = new JTextField();
		JButton b1 = new JButton("Conferma");
		JButton b2 = new JButton("Indietro");
		JRadioButton s = new JRadioButton("Carnivoro", false);
		JRadioButton s1 = new JRadioButton("Erbivoro", false);

		ButtonGroup group = new ButtonGroup();
		group.add(s);
		group.add(s1);

		RadioListener sceltaTipo = new RadioListener();
		s.addActionListener(sceltaTipo);
		s1.addActionListener(sceltaTipo);

		b1.addActionListener(new creataRazza());
		b2.addActionListener(new tornaMenu());

		JPanel scelta = new JPanel(new GridLayout(1, 2));
		scelta.add(s);
		scelta.add(s1);

		JPanel pannello = new JPanel();
		pannello.setLayout(new GridLayout(3, 2));

		pannello.add(l1);
		pannello.add(tf1);
		pannello.add(l2);
		pannello.add(scelta);
		pannello.add(b1);
		pannello.add(b2);

		window.setTitle("CREAZIONE NUOVA RAZZA");
		window.add(pannello, BorderLayout.CENTER);
	}

	/**	
	 * Metodo che implementa il Frame di base come "Visualizza Classifica" che mostra la classifica dei punteggi corrente,
	 * elencando, per i primi 10 classificati, la Posizione, l'Username, la Razza, il Punteggio e dire se e' o meno estinta.
	 */
	private void classifica() {
		int i, k, counter = 5;
		ArrayList<JLabel> livelli = new ArrayList<JLabel>();

		window.setExtendedState(MAXIMIZED_BOTH);

		window.setLayout(new BorderLayout());

		esito = client.classifica();
		estraiClassifica(esito);

		JPanel pannello = new JPanel(new GridLayout(11, 5));
		livelli.add(new JLabel("POSIZIONE"));
		livelli.add(new JLabel("USERNAME"));
		livelli.add(new JLabel("RAZZA"));
		livelli.add(new JLabel("PUNTEGGIO"));
		livelli.add(new JLabel("ESTINTA"));

		JButton ok = new JButton("OK");
		ok.addActionListener(new chiudiLista());

		pannello.add(livelli.get(0));
		pannello.add(livelli.get(1));
		pannello.add(livelli.get(2));
		pannello.add(livelli.get(3));
		pannello.add(livelli.get(4));

		for (i = 0; i < lista.size(); i++) {
			livelli.add(new JLabel("# " + (i + 1)));
			livelli.add(new JLabel(estraiUserClass(i)));
			livelli.add(new JLabel(estraiRazzaClass(i)));
			livelli.add(new JLabel(estraiPuntiClass(i)));
			if (estraiGiocoClass(i).equals("false"))
				livelli.add(new JLabel("No"));
			else
				livelli.add(new JLabel("Si"));

			pannello.add(livelli.get(counter));
			counter++;
			pannello.add(livelli.get(counter));
			counter++;
			pannello.add(livelli.get(counter));
			counter++;
			pannello.add(livelli.get(counter));
			counter++;
			pannello.add(livelli.get(counter));
			counter++;

			virgole.removeAll(virgole);
		}

		for (k = i; k < 55 - counter; k++) {
			pannello.add(new JLabel());
		}
		window.add(pannello);
		window.add(ok, BorderLayout.SOUTH);
		window.setTitle("CLASSIFICA DEI MIGLIORI 10");
	}

	/**	
	 * Metodo che implementa il Frame di base come "Visualizza Lista Giocatori" che mostra la lista degli
	 * utenti attualmente in partita.
	 */
	private void listaGioc() {
		int i, k;
		window.setSize(screenSize.width / 3, screenSize.height - 50);
		window.setLayout(new BorderLayout());
		window.setTitle("ATTUALMENTE IN PARTITA");

		estraiLista(esito);
		virgole.removeAll(virgole);

		JButton ok = new JButton("OK");
		ok.addActionListener(new chiudiLista());

		JPanel pannello = new JPanel(new GridLayout(8, 1));
		for (i = 0; i < lista.size(); i++)
			pannello.add(new JLabel(lista.get(i)));

		for (k = 0; k < 8 - i; k++)
			pannello.add(new JLabel());

		window.add(pannello, BorderLayout.CENTER);
		window.add(ok, BorderLayout.SOUTH);
	}

	/**	
	 * Metodo che implementa il Frame di base come "Visualizza Lista Dinosauri" che mostra la lista degli Id dei
	 * dinosauri di un utente attualmente in partita.
	 */
	private void listaDino() {
		int i;
		JPanel pannello;

		window.setSize(screenSize.width / 3, screenSize.height - 50);
		window.setLayout(new BorderLayout());
		window.setTitle("LISTA DEGLI ID DEI TUOI DINOSAURI");

		estraiLista(esito);
		virgole.removeAll(virgole);

		JButton ok = new JButton("OK");
		ok.addActionListener(new chiudiLista());

		if ((8 - lista.size()) > 0)
			pannello = new JPanel(new GridLayout(lista.size()
					+ (8 - lista.size()), 2));
		else
			pannello = new JPanel(new GridLayout(lista.size(), 2));

		JPanel pannello1 = new JPanel(new GridLayout(1, 2));
		pannello1.add(new JLabel("Dinosauro"));
		pannello1.add(new JLabel("ID Dinosauro"));
		for (i = 0; i < lista.size(); i++) {
			pannello.add(new JLabel("# " + (i + 1)));
			pannello.add(new JLabel(lista.get(i)));
		}
		for (i = 0; i < 8 - lista.size(); i++) {
			pannello.add(new JLabel());
			pannello.add(new JLabel());
		}

		window.add(pannello1, BorderLayout.NORTH);
		window.add(pannello, BorderLayout.CENTER);
		window.add(ok, BorderLayout.SOUTH);

	}

	/**	
	 * Metodo che implementa il Frame di base come "Menu Cresci Dinosauro" che richiede l'Id del dinosauro
	 * che si vuole far crescere, potendo confermare poi l'azione o tornare indietro.
	 */
	private void cresciDinosauro() {
		window.setSize(400, 150);
		window.setTitle("Menu Cresci Dinosauro");
		window.setLayout(new BorderLayout());

		JPanel pannello = new JPanel(new GridLayout(2, 2));
		JButton cresci = new JButton("Cresci");		
		JButton indietro = new JButton("Indietro");
		JLabel idDino = new JLabel("Id Dinosauro");
		tf1 = new JTextField();

		pannello.add(idDino);
		pannello.add(tf1);
		pannello.add(cresci);
		pannello.add(indietro);

		indietro.addActionListener(new tornaMappa());
		cresci.addActionListener(new cresciDino());

		window.add(pannello);
	}

	/**	
	 * Metodo che implementa il Frame di base come "Menu Deponi Uovo" che richiede l'Id del dinosauro
	 * che si vuole far deporre, potendo confermare poi l'azione o tornare indietro.
	 */
	private void deponiUovo() {
		window.setSize(400, 150);
		window.setTitle("Menu Deponi Uovo");
		window.setLayout(new BorderLayout());

		JPanel pannello = new JPanel(new GridLayout(2, 2));
		JButton deponi = new JButton("Deponi");
		JButton indietro = new JButton("Indietro");
		JLabel idDino = new JLabel("Id Dinosauro");
		tf1 = new JTextField();

		pannello.add(idDino);
		pannello.add(tf1);
		pannello.add(deponi);
		pannello.add(indietro);

		indietro.addActionListener(new tornaMappa());
		deponi.addActionListener(new deponiUovo());

		window.add(pannello);
	}

	/**	
	 * Metodo che implementa il Frame di base come "Menu Movimento Dinosauro" che richiede l'Id del dinosauro
	 * che si vuole far muovere, le nuove coordinate Riga e Colonna in cui si vuole spostarlo e la possibilita' di confermare
	 * il movimento o tornare indietro.
	 */
	private void muoviDino() {
		window.setSize(400, 350);
		window.setTitle("Menu Movimento Dinosauro");
		window.setLayout(new BorderLayout());

		JPanel pannello = new JPanel(new GridLayout(4, 4));
		JButton muovi = new JButton("Muovi");
		JButton indietro = new JButton("Indietro");
		JLabel idDino = new JLabel("Id Dinosauro");
		JLabel newPosX = new JLabel("Nuova Riga");
		JLabel newPosY = new JLabel("Nuova Colonna");
		tf1 = new JTextField();
		tf2 = new JTextField();
		tf3 = new JTextField();

		pannello.add(idDino);
		pannello.add(tf1);
		pannello.add(newPosX);
		pannello.add(tf2);
		pannello.add(newPosY);
		pannello.add(tf3);
		pannello.add(muovi);
		pannello.add(indietro);

		indietro.addActionListener(new tornaMappa());
		muovi.addActionListener(new muoviDino());

		window.add(pannello);
	}

	/**	
	 * Metodo che implementa il Frame di base come "Menu Vista Locale" che richiede l'Id del dinosauro di cui
	 * si vuole la Vista, potendo confermare poi l'azione o tornare indietro.
	 */
	private void vistaLocale() {
		window.setSize(400, 150);
		window.setTitle("Menu Vista Locale");
		window.setLayout(new BorderLayout());

		JPanel pannello = new JPanel(new GridLayout(2, 2));
		JButton vista = new JButton("Vista");
		JButton indietro = new JButton("Indietro");
		JLabel idDino = new JLabel("Id Dinosauro");
		tf1 = new JTextField();

		pannello.add(idDino);
		pannello.add(tf1);
		pannello.add(vista);
		pannello.add(indietro);

		indietro.addActionListener(new tornaMappa());
		vista.addActionListener(new vistaLocale());

		window.add(pannello);
	}

	/**
	 * Richiamato dal metodo vistaLocale(), serve a stampare a video l'effettiva vista del dinosauro che e' stata
	 * richiesta dall'utente al server.
	 */
	private void stampaVistaLocale() {
		int i, j = 0, x, y, y_orig, k, righe, colonne, graffa = 0, virgola,scorriLista;
		int trovato=0,stampaDa=0;
		String idDino, vita,esito1="";
		
		for (i = 0; i < esito.length(); i++)
			if (esito.substring(i, i + 1).equals("{"))
				graffa = i;
		righe = Integer.parseInt(esito.substring(graffa + 1, graffa + 2));
		colonne = Integer.parseInt(esito.substring(graffa + 3, graffa + 4));

		for (i = esito.length() - 1; i > 0; i--)
			if (esito.substring(i, i + 1).equals("{"))
				graffa = i;
		if (esito.substring(graffa + 2, graffa + 3).equals(",")) {
			x = Integer.parseInt(esito.substring(graffa + 1, graffa + 2));
			virgola = graffa + 2;
		} else {
			x = Integer.parseInt(esito.substring(graffa + 1, graffa + 3));
			virgola = graffa + 3;
		}
		if (esito.substring(virgola + 2, virgola + 3).equals("}")){
			stampaDa=virgola+3;
			y = Integer.parseInt(esito.substring(virgola + 1, virgola + 2));
		}
		else{
			stampaDa=virgola+4;
			y = Integer.parseInt(esito.substring(virgola + 1, virgola + 3));
		}
		
		JPanel griglia = new JPanel(new GridLayout(righe, colonne));
		window.setSize(colonne*75,(righe*75)+(righe*7));
		window.setTitle("Vista Locale");
		window.setLayout(new BorderLayout());
		
		JButton[] caselle = new JButton[righe * colonne];
		for (i = 0; i < righe * colonne; i++)
			caselle[i] = null;
		
		y_orig = y;
		for(i=stampaDa; i<esito.length(); i++)		//controlla su quale immagine mettere a ogni bottone
		{
			while((x<0||x>39||y<0||y>39)&&j<righe*colonne) {
				caselle[j] = new JButton();
				caselle[j].setIcon(FnF);
				griglia.add(caselle[j]);
				j++;
				if (y == y_orig + colonne -1) {
					x++;
					y = y_orig;
				} else
					y++;
			}
			
				if (esito.substring(i, i + 1).equals("t")) {
					caselle[j] = new JButton();
					caselle[j].setIcon(terra);
					griglia.add(caselle[j]);
					caselle[j].setToolTipText("[" + x + "," + y + "]");
					j++;
					if (y == y_orig + colonne - 1) {
						x++;
						y = y_orig;
					} else
						y++;
				}

				if (esito.substring(i, i + 1).equals("c")) {
					vita = "";
					caselle[j] = new JButton();
					caselle[j].setIcon(carogna);
					griglia.add(caselle[j]);

					k = i + 2;
					do {
						vita = vita + esito.substring(k, k + 1);
						k++;
					} while (!esito.substring(k, k + 1).equals("]"));
					caselle[j].setToolTipText("[" + x + "," + y + "];Energia="
							+ vita);
					j++;
					if (y == y_orig + colonne -1) {
						x++;
						y = y_orig;
					} else
						y++;
				}

				if (esito.substring(i, i + 1).equals("v")) {
					vita = "";
					caselle[j] = new JButton();
					caselle[j].setIcon(vege);
					griglia.add(caselle[j]);

					k = i + 2;
					do {
						vita = vita + esito.substring(k, k + 1);
						k++;
					} while (!esito.substring(k, k + 1).equals("]"));
					caselle[j].setToolTipText("[" + x + "," + y + "];Energia="
							+ vita);
					j++;
					if (y == y_orig + colonne -1) {
						x++;
						y = y_orig;
					} else
						y++;
				}
				
				if (esito.substring(i, i + 1).equals("d")) {
					idDino = "";
					esito1 = client.listaDinosauri();
				
					estraiLista(esito1);
					virgole.removeAll(virgole);
				
					caselle[j] = new JButton();
					griglia.add(caselle[j]);
				
					k = i + 2;
					do {
						idDino = idDino + esito.substring(k, k + 1);
						k++;
					} while (!esito.substring(k, k + 1).equals("]"));

				
					scorriLista=0;
					do{
						if(idDino.equals(lista.get(scorriLista))){
							caselle[j].setIcon(dinoMio);
							trovato=1;
							scorriLista++;
						}
						else
							scorriLista++;
						}while(scorriLista<lista.size()&&trovato==0);
					if(trovato==0)
						caselle[j].setIcon(dinoEnemy);
					trovato=0;						
						
					caselle[j].setToolTipText("[" + x + "," + y + "];IdDino="
							+ idDino);
					j++;
					if (y == y_orig + colonne -1) {
						x++;
						y = y_orig;
					} else
						y++;
				}
				scorriLista=0;
			
				if (esito.substring(i, i + 1).equals("a")) {
					caselle[j] = new JButton();
					caselle[j].setIcon(acqua);
					griglia.add(caselle[j]);
					caselle[j].setToolTipText("[" + x + "," + y + "]");
					j++;
					if (y == y_orig + colonne -1) {
						x++;
						y = y_orig;
					} else
						y++;
				}
		}

		JButton ok = new JButton("Ok");
		ok.addActionListener(new chiudiLista());

		window.add(ok, BorderLayout.SOUTH);
		window.add(griglia, BorderLayout.CENTER);
	}

	/**	
	 * Metodo che implementa il Frame di base come "Menu Stato Dinosauro" che richiede l'Id del dinosauro
	 * di cui si vuole lo stato, potendo confermare poi l'azione o tornare indietro.
	 */
	private void statoDino() {
		window.setSize(400, 150);
		window.setTitle("Menu Stato Dinosauro");
		window.setLayout(new BorderLayout());

		JPanel pannello = new JPanel(new GridLayout(2, 2));
		JButton stato = new JButton("Mostra Stato");
		JButton indietro = new JButton("Indietro");
		JLabel idDino = new JLabel("Id Dinosauro");
		tf1 = new JTextField();

		pannello.add(idDino);
		pannello.add(tf1);
		pannello.add(stato);
		pannello.add(indietro);

		indietro.addActionListener(new tornaMappa());
		stato.addActionListener(new stampaStatoDino());

		window.add(pannello);
	}

	/**
	 * Richiamato dal metodo statoDino(), serve a stampare a video l'effettivo stato del dinosauro che e' stato
	 * richiesta dall'utente al server.
	 */
	private void stampaStatoDino() {
		JPanel pannello = new JPanel(new GridLayout(7, 2));
		String tipologia;

		window.setSize(screenSize.width / 3, screenSize.height - 50);
		window.setLayout(new BorderLayout());
		window.setTitle("STATO DEL DINOSAURO");

		estraiLista(esito); // con estrai lista riesco a isolare le componenti
							// dello Stato
		virgole.removeAll(virgole); // e poi elimino l'array delle virgole

		JButton ok = new JButton("OK");
		ok.addActionListener(new chiudiLista());

		JLabel utente = new JLabel("Utente: ");
		JLabel nome_utente = new JLabel(lista.get(0));
		JLabel razza = new JLabel("Razza: ");
		JLabel nome_razza = new JLabel(lista.get(1));
		JLabel tipo = new JLabel("Tipo di Dinosauro:");
		tipologia = lista.get(2);
		if (tipologia.equals("c"))
			tipologia = "Carnivoro";
		else
			tipologia = "Erbivoro";
		JLabel tipoCE = new JLabel(tipologia);
		JLabel posizione = new JLabel("Posizione:");
		JLabel posizXY = new JLabel("[ " + lista.get(3) + " , " + lista.get(4)
				+ " ]");
		JLabel dimensione = new JLabel("Dimensione:");
		JLabel dimEffettiva = new JLabel(lista.get(5));

		pannello.add(utente);
		pannello.add(nome_utente);
		pannello.add(razza);
		pannello.add(nome_razza);
		pannello.add(tipo);
		pannello.add(tipoCE);
		pannello.add(posizione);
		pannello.add(posizXY);
		pannello.add(dimensione);
		pannello.add(dimEffettiva);

		if (lista.size() == 8) {
			JLabel energia = new JLabel("Energia:");
			JLabel energiaAttuale = new JLabel(lista.get(6));
			JLabel vita = new JLabel("Turni Vissuti:");
			JLabel vitaVissuta = new JLabel(lista.get(7));

			pannello.add(energia);
			pannello.add(energiaAttuale);
			pannello.add(vita);
			pannello.add(vitaVissuta);
		}

		window.add(pannello, BorderLayout.CENTER);
		window.add(ok, BorderLayout.SOUTH);

	}

	// questo metodo stampa a video in un messagge dialog il valore passato
	// lo uso nelle azioni

	/**
	 * Stampa a video, in un MessageDialog, il messaggio che viene passato al medoto con mess.
	 * 
	 * @param mess Messaggio che si vuole venga stampato a video all'utente.
	 */
	//@requires mess!=null;
	private void stampaMex(String mess) {
		JOptionPane.showMessageDialog(this, mess);
	}

	/**
	 * Estrea, ricevuta la classifica, una stringa che contiene, non ancora separate, tutte le informazioni relative a una posizione
	 * della stessa, compilando un ArrayList che conterra', quindi, una stringa per ogni posizione occupata in classifica, con
	 * le informazioni che dovranno essere divise.
	 * 
	 * @param classifica Il messaggio del server contenente l'intera classifica che deve essere suddivisa.
	 */
	//@requires classifica!=null;
	//@assert i>=0;
	private void estraiClassifica(String classifica) {
		int i;
		ArrayList<Integer> graffe = new ArrayList<Integer>();

		for (i = 0; i < classifica.length(); i++)
			if (classifica.substring(i, i + 1).equals("{")
					|| classifica.substring(i, i + 1).equals("}"))
				graffe.add(i);

		for (i = 0; i < graffe.size() - 1; i = i + 2) {
			lista.add(classifica.substring(graffe.get(i) + 1, graffe.get(i + 1)));
		}
	}

	/**
	 * Estra, da una stringa della lista contenente tutte le informazioni su una posizione della classifica, l'username.
	 * 
	 * @param i Indice dell'elemento in lista su cui fare estrazione.
	 * @return Username estratto.
	 */
	//@requires i>=0;
	//@assert k>=0;
	//@ensures \result!=null;
	private String estraiUserClass(int i) {
		int k;

		for (k = 0; k < lista.get(i).length(); k++)
			if (lista.get(i).substring(k, k + 1).equals(","))
				virgole.add(k);
		// trova le virgole in un classificato memorizzato nell'ArrayList lista
		// alla posizione i e le salva nell'ArrayList virgole generale

		return lista.get(i).substring(0, virgole.get(0));
	}

	/**
	 * Estra, da una stringa della lista contenente tutte le informazioni su una posizione della classifica, il nome della razza.
	 * 
	 * @param i Indice dell'elemento in lista su cui fare estrazione.
	 * @return Nome razza estratto.
	 */
	//@requires i>=0;
	//@ensures \result!=null;
	private String estraiRazzaClass(int i) {
		return lista.get(i).substring(virgole.get(0) + 1, virgole.get(1));
	}

	/**
	 * Estra, da una stringa della lista contenente tutte le informazioni su una posizione della classifica, il punteggio.
	 * 
	 * @param i Indice dell'elemento in lista su cui fare estrazione.
	 * @return Punteggio dell'utente.
	 */
	//@requires i>=0;
	//@ensures \result!=null;
	private String estraiPuntiClass(int i) {
		return lista.get(i).substring(virgole.get(1) + 1, virgole.get(2));
	}

	/**
	 * Estra, da una stringa della lista contenente tutte le informazioni su una posizione della classifica, se la razza
	 * e' estinta o meno.
	 * 
	 * @param i Indice dell'elemento in lista su cui fare estrazione.
	 * @return Esito se la razza e' o meno estinta.
	 */
	//@requires i>=0;
	//@ensures \result!=null;
	private String estraiGiocoClass(int i) {
		return lista.get(i).substring(virgole.get(2) + 1, lista.get(i).length());
	}

	/**
	 * Data una stringa contenente una lista generica, i cui elementi sono separati da virgole,
	 * estrae ogni elemento e lo aggiunge in un ArrayList.
	 * 
	 * @param listaIntera Stringa contentente l'intera lista da dividere.
	 */
	//@requires listaIntera!=null;
	private void estraiLista(String listaIntera) {
		int i;
		for (i = 0; i < listaIntera.length() - 1; i++)
			if (listaIntera.substring(i, i + 1).equals(","))
				virgole.add(i);

		for (i = 0; i < virgole.size() - 1; i++)
			lista.add(listaIntera.substring(virgole.get(i) + 1,virgole.get(i + 1)));
		lista.add(listaIntera.substring(virgole.get(i) + 1,	listaIntera.length()));
	}

	
	private class login implements ActionListener {
		public void actionPerformed(ActionEvent e) {

			esito = client.login(tf1.getText(),
					String.valueOf(pf1.getPassword()));

			if (esito.substring(1, 3).equals("no")) {
				esito = "Username o Password errate, Login fallito.";
				stampaMex(esito);
				tf1.setText("");
				pf1.setText("");
			} 
			else {
				esito = "Login effettuato correttamente!!!";
				stampaMex(esito);
				username = tf1.getText();
				window.setVisible(false);
				nuovoForm("Menu Fuori Partita", null);
			}
		}

	}
	
	
	private class loadGame implements ActionListener {
		public void actionPerformed(ActionEvent e) {
			client.caricaPartita();
			window.setVisible(false);
			nuovoForm("Identificazione", null);
			
		}
	}
	
	private class nextFrame implements ActionListener {
		public void actionPerformed(ActionEvent e) {
			window.setVisible(false);
			nuovoForm("Identificazione", null);
			
		}
	}
	

	private class LoadMap implements ActionListener {
		public void actionPerformed(ActionEvent e) {
			try {
				client = new Client(new Server("caricata"));
			} catch (RemoteException e1) {

				e1.printStackTrace();
			}
			window.setVisible(false);
			nuovoForm("Scelta Partita", null);

		}

	}

	private class MappaRandom implements ActionListener {
		public void actionPerformed(ActionEvent e) {

			try {
				client = new Client(new Server("casuale"));
			} catch (RemoteException e1) {

				e1.printStackTrace();
			}
			window.setVisible(false);
			nuovoForm("Scelta Partita", null);
		}
	}

	private class Locale implements ActionListener {
		public void actionPerformed(ActionEvent e) {

			window.setVisible(false);
			nuovoForm("Scelta Mappa", null);


		}

	}

	private class Sock implements ActionListener {
		public void actionPerformed(ActionEvent e) {
			try {
				client = new Client(new ServerProxy());
			} catch (RemoteException e1) {

				e1.printStackTrace();
			}
			window.setVisible(false);
			nuovoForm("Identificazione", null);
		}

	}
	private class RMI implements ActionListener {
		public void actionPerformed(ActionEvent e) {
			try {
				InterfacciaServer server = null;
				try {
					server = (InterfacciaServer)Naming.lookup("rmi://127.0.0.1/server:1999");
				} catch (MalformedURLException e1) {

					e1.printStackTrace();
				} catch (NotBoundException e1) {

					e1.printStackTrace();
				}
				client=new Client(server);
			} catch (RemoteException e1) {

				e1.printStackTrace();
			}
			window.setVisible(false);
			nuovoForm("Identificazione", null);
		}

	}

	private class backToId implements ActionListener {
		public void actionPerformed(ActionEvent e) {
			window.setVisible(false);
			nuovoForm("Identificazione", null);
		}

	}
	
	private class refreshMap implements ActionListener {
		public void actionPerformed(ActionEvent e) {
			aggiornaMappa(client.mappaGenerale());
		}

	}
	
	

	private class menuCreaGioc implements ActionListener {
		public void actionPerformed(ActionEvent e) {
			window.setVisible(false);
			nuovoForm("Menu Crea Giocatore", null);
		}

	}

	private class menuLogin implements ActionListener {
		public void actionPerformed(ActionEvent e) {

			window.setVisible(false);
			nuovoForm("Login", null);
		}

	}

	private class creaGiocatore implements ActionListener {
		public void actionPerformed(ActionEvent e) {

			// questo per esempio e l'azione per il tasto Conferma nel menu
			// CreaGiocatore

		if(tf1.getText().equals("")||String.valueOf(pf1.getPassword()).equals("")){
			stampaMex("Non sono stati compilati tutti i campi.");
			tf1.setText("");
			pf1.setText("");
		}
		else{
			esito = client.creaGiocatore(tf1.getText(),String.valueOf(pf1.getPassword()));

			if (esito.substring(1, 3).equals("no")) {
				stampaMex("Username gia' occupato. Inseriscine uno nuovo.");
				tf1.setText("");
				pf1.setText("");
			} 
			else {
				stampaMex("Nuovo utente creato correttamente");
				window.setVisible(false);
				nuovoForm("Identificazione", null);
				}	
			}
		}
	}

	private class creaRazza implements ActionListener {
		public void actionPerformed(ActionEvent e) {

			window.setVisible(false);
			nuovoForm("Crea una nuova razza!!!", null);
		}

	}

	private class menuGioco implements ActionListener {
		public void actionPerformed(ActionEvent e) {
			esito = client.accessoPartita();

			if (esito.substring(1, 3).equals("no")) {
				esito = esito.substring(4, esito.length());
				stampaMex(esito);
			} else {
				window.setVisible(false);
				esito = client.mappaGenerale();
				nuovaSessione();
			}
		}
	}

	private class visualizzaClass implements ActionListener {
		public void actionPerformed(ActionEvent e) {

			nuovoForm("Classifica Generale", null);
		}
	}

	private class listaGioc implements ActionListener {
		public void actionPerformed(ActionEvent e) {

			esito = client.listaGiocatori();
			if (esito.length() < 16) {
				esito = "Nessun giocatore in partita";
				stampaMex(esito);
			} else {
				nuovoForm("Attualmente in Partita", null);
			}
		}
	}

	private class RadioListener implements ActionListener {
		public void actionPerformed(ActionEvent e) {
			if (e.getActionCommand().equals("Carnivoro"))
				tipo = "c";
			else
				tipo = "e";
		}
	}

	private class creataRazza implements ActionListener {
		public void actionPerformed(ActionEvent e) {
			if(tf1.getText().equals("")){
				stampaMex("Non hai inserito il nome per la razza.");
				tf1.setText("");
			}
			else{	
				if(tipo.equals("c")||tipo.equals("e"))
				{	esito = client.creaRazza(tf1.getText(), tipo);

					if (esito.substring(1, 3).equals("no")) {
						stampaMex(esito.substring(4,esito.length()));
						tf1.setText("");
					} else {
						esito = "Razza creata correttamente!!!";
						stampaMex(esito);

						window.setVisible(false);
						nuovoForm("Menu Fuori Partita", null);
					}
				}else	{
				stampaMex("Seleziona il tipo!");
				}
			}	
		}
	}

	private class chiudiLista implements ActionListener {
		public void actionPerformed(ActionEvent e) {

			lista.removeAll(lista); // pulisce lista
			window.setVisible(false); // nasconde
		}
	}

	// Indietro di crea razza
	private class tornaMenu implements ActionListener {
		public void actionPerformed(ActionEvent e) {
			window.setVisible(false);
			nuovoForm("Menu Fuori Partita", null);
		}
	}

	// indietro di cresci,muovi,deponi ecc....
	private class tornaMappa implements ActionListener {
		public void actionPerformed(ActionEvent e) {
			window.setVisible(false);
		}
	}

	private class logout implements ActionListener {
		public void actionPerformed(ActionEvent e) {

			esito = client.logout();
			if (esito.substring(1, 3).equals("no")) {
				esito = "Impossibile effettuare il Logout";
				stampaMex(esito);
			} else {
				esito = "Logout eseguito correttamente";
				stampaMex(esito);
				window.setVisible(false);
				nuovoForm("LogoutToId", null);
			}
		}
	}

	private class statoDino implements ActionListener {
		public void actionPerformed(ActionEvent e) {

			nuovoForm("Stato Dino", null);
		}
	}

	private class stampaStatoDino implements ActionListener {
		public void actionPerformed(ActionEvent e) {
			if (tf1.getText().isEmpty())
				stampaMex("Manca l'Id del Dinosauro di cui vuoi lo stato");
			else {
				esito = client.statoDino(tf1.getText());
				if (esito.substring(1, 3).equals("no"))
					stampaMex(esito.substring(4, esito.length()));
				else {
					window.setVisible(false);
					nuovoForm("Stampa Stato Dino", null);
				}
			}
		}
	}

	private class vistaDino implements ActionListener {
		public void actionPerformed(ActionEvent e) {

			nuovoForm("Vista Locale", null);
		}
	}

	private class vistaLocale implements ActionListener {
		public void actionPerformed(ActionEvent e) {
			if (tf1.getText().isEmpty())
				stampaMex("Manca l'Id del Dinosauro di cui vuoi la vista");
			else {
				esito = client.vistaDino(tf1.getText());
				if (esito.substring(1, 3).equals("no"))
					stampaMex(esito.substring(4, esito.length()));
				else {
					window.setVisible(false);
					nuovoForm("Stampa Vista Locale", null);
				}
			}
		}
	}

	private class muovi implements ActionListener {
		public void actionPerformed(ActionEvent e) {
			if(!giamosso.isGiamosso())
				nuovoForm("Muovi Dinosauro", null);
			else
				stampaMex("Ti sei gia mosso in questo turno!");
			
		}
	}

	private class muoviDino implements ActionListener {
		public void actionPerformed(ActionEvent e) {
			
			
				if (tf1.getText().isEmpty() || tf2.getText().isEmpty()
						|| tf3.getText().isEmpty())
					stampaMex("Mancano le informazioni necessarie far muovere il Dinosauro, ritenta");
				else {
					esito = client.muoviDino(tf1.getText(), tf2.getText(),
							tf3.getText());
					if (esito.substring(1, 3).equals("no"))
						stampaMex(esito.substring(4, esito.length()));
					else{
						giamosso.setGiamosso(true);
					if(esito.length()>4)
						if(esito.substring(esito.length()-1, esito.length()).equals("v"))
							stampaMex("Il tuo dinosauro ha vinto lo scontro!!!!");
						else
							stampaMex("Il tuo dinosauro ha perso lo scontro!!!!");
					}
					
					window.setVisible(false);
					scroll.setVisible(false);
					aggiornaMappa(client.mappaGenerale());
				}
			
			
		}
	}

	private class cresci implements ActionListener {
		public void actionPerformed(ActionEvent e) {
			
			if(!giamosso.isGiacresciutoodeposto())
			{	
				nuovoForm("Cresci Dinosauro", null);
			}
			else
			{
				stampaMex("Azione negata! Passa il turno!");
			}
			
		}
	}

	private class cresciDino implements ActionListener {
		public void actionPerformed(ActionEvent e) {
		if (tf1.getText().isEmpty())
				stampaMex("Manca l'Id del Dinosauro che vuoi far crescere, ritenta");
			else {
				esito = client.cresciDino(tf1.getText());
				if (esito.substring(1, 3).equals("no"))
					stampaMex(esito.substring(4, esito.length()));
				else
				{					
					giamosso.setGiacresciutoodeposto(true);
				}
				window.setVisible(false);
				scroll.setVisible(false);
				aggiornaMappa(client.mappaGenerale());
			}
		
		
		
		}
	}

	private class deponi implements ActionListener {
		public void actionPerformed(ActionEvent e) {
			if(!giamosso.isGiacresciutoodeposto())
			{
				nuovoForm("Deponi Uovo", null);
			}
			else
			{
				stampaMex("Azione negata! Passa il turno!");
			}
			
		}
	}

	private class deponiUovo implements ActionListener {
		public void actionPerformed(ActionEvent e) {
			
			if (tf1.getText().isEmpty())
				stampaMex("Manca l'Id del Dinosauro che vuoi far deporre, ritenta");
			else {
				esito = client.deponiUovo(tf1.getText());
				if (esito.substring(1, 3).equals("no"))
					stampaMex(esito.substring(4, esito.length()));
				else
				{
					giamosso.setGiacresciutoodeposto(true);
				}
				window.setVisible(false);
				scroll.setVisible(false);
				aggiornaMappa(client.mappaGenerale());
				
			}	
		}
	}

	private class lista implements ActionListener {
		public void actionPerformed(ActionEvent e) {

			esito = client.listaDinosauri();
			if (esito.substring(1, 3).equals("no")) {
				esito = "Non e' stato possibile ricavare la lista dei Dinosauri.";
				stampaMex(esito);
			} else
				nuovoForm("Lista dei Dinosauri", null);
		}
	}

	private class passaTurno implements ActionListener {
		public void actionPerformed(ActionEvent e) {
			esito = client.passaTurno();
			if (esito.substring(1, 3).equals("no"))
				stampaMex(esito.substring(4, esito.length()));
			else
				{
				turno.setText("Turno Passato");
				aggiornaMappa(client.mappaGenerale());
				giamosso.setGiamosso(false);
				giamosso.setGiacresciutoodeposto(false);
				
					
				}
		}
	}

	private class esci implements ActionListener {
		public void actionPerformed(ActionEvent e) {

			esito = client.uscitaPartita();
			if (esito.substring(1, 3).equals("no")) {
				esito = "Impossibile uscire dalla partita";
				stampaMex(esito);
			} else {
				esito = "Uscita eseguita correttamente";
				stampaMex(esito);
				if(turno.getText().substring(15,turno.getText().length()).equals(username))
					client.passaTurno();
				t2.cancel();
				t2=new Timer();
				sessioneDiGioco.setVisible(false);
				nuovoForm("Menu Fuori Partita", null);
			}
		}
	}

	private class chiudiTutto implements ActionListener {
		public void actionPerformed(ActionEvent e) {
			dispose();
			System.exit(0);
		}
	}
}
